import os
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageDraw

def resize_6inch_image(image_path, border_percent=5):
    # 读取原始图片
    tmp_image = Image.open(image_path)
    original_width, original_height = tmp_image.size

    # 判断图片的宽高比，决定是否需要旋转或转置
    if original_width < original_height:
        # 图片是竖的，需要转置
        tmp_image = transpose_image(tmp_image)
        width, height = original_height, original_width
    else:
        # 图片是横的，无需旋转或转置
        width, height = original_width, original_height

    print(f'Original Width: {original_width}, Original Height: {original_height}')
    print(f'Width after Transpose: {width}, Height after Transpose: {height}')

    # 最终输出图像大小为7200x4800，计算白边大小
    whiteWidth = int(7200 * border_percent / 100)
    whiteHeight = int(4800 * border_percent / 100)

    # 计算用于放置图片的区域大小
    imageWidth = 7200 - (whiteWidth * 2)
    imageHeight = 4800 - (whiteHeight * 2)

    # 计算缩放因子
    scale_factor = min(imageWidth / float(width), imageHeight / float(height))

    # 计算缩放后的图片尺寸
    new_width = int(width * scale_factor)
    new_height = int(height * scale_factor)

    # 对图片进行缩放
    resized_image = tmp_image.resize((new_width, new_height), Image.LANCZOS)

    # 创建画布，大小7200x4800，背景为白色
    collage = Image.new('RGB', (7200, 4800), color='white')

    # 计算图片在画布上的位置，居中显示
    left = (7200 - new_width) // 2
    top = (4800 - new_height) // 2

    # 将缩放后的图片粘贴到画布上
    collage.paste(resized_image, (left, top))

    return collage

def transpose_image(original_image):

    # 获取原始图像的宽度和高度
    original_width, original_height = original_image.size

    # 创建转置后的新图像，其大小是原始图像的高度和宽度交换后的结果
    transposed_image = Image.new(original_image.mode, (original_height, original_width))

    # 遍历原始图像的每个像素
    for y in range(original_height):
        for x in range(original_width):
            # 获取原始图像上当前像素的颜色
            pixel_color = original_image.getpixel((x, y))

            # 计算转置后图像上对应像素的位置（通过交换x和y）
            transposed_x, transposed_y = y, x

            # 将颜色设置到转置后图像的对应位置
            transposed_image.putpixel((transposed_x, transposed_y), pixel_color)

            # 返回转置后的图像
    return transposed_image

def resize_3inch_image(image_path, border_percent=5):
    # 读取原始图片
    tmp_image = Image.open(image_path)
    original_width, original_height = tmp_image.size

    # 判断图片的宽高比，决定是否需要旋转
    if original_width < original_height:
        # 图片是竖的，需要旋转90度，同时交换宽高
        # tmp_image = tmp_image.rotate(90)
        tmp_image = transpose_image(tmp_image)
        width, height = original_height, original_width
    else:
        # 图片是横的，无需旋转
        width, height = original_width, original_height

    print(f'original_width: {original_width}/4800,\toriginal_height: {original_height}/3600')
    print(f'Width: {width}/4800,\tHeight: {height}/3600')
    # 计算白边大小
    whiteWidth = int(4800 * border_percent / 100)
    whiteHeight = int(3600 * border_percent / 100)

    # 计算用于放置图片的区域大小
    imageWidth = 4800 - (whiteWidth * 2)
    imageHeight = 3600 - (whiteHeight * 2)

    # 计算缩放因子
    scale_factor = min(imageWidth / float(width), imageHeight / float(height))

    # 计算缩放后的图片尺寸
    new_width = int(width * scale_factor)
    new_height = int(height * scale_factor)

    # 对图片进行缩放
    resized_image = tmp_image.resize((new_width, new_height), Image.LANCZOS)

    # 创建画布，大小4800x3600，背景为白色
    tmp_collage = Image.new('RGB', (4800, 3600), color='white')

    # 计算图片在画布上的位置，居中显示
    left = (4800 - new_width) // 2
    top = (3600 - new_height) // 2

    # 将缩放后的图片粘贴到画布上
    tmp_collage.paste(resized_image, (left, top))

    return tmp_collage

def concatTwoPic(image1_path, image2_path, output_folder,border_percent):
    # 调用resize_3inch_image函数调整两张图片大小
    image1 = resize_3inch_image(image1_path, border_percent)
    image2 = resize_3inch_image(image2_path, border_percent)

    # 创建画布，大小4800*7200
    collageResult = Image.new('RGB', (4800, 7200), color='white')

    # 开始拼接两个三寸照片，大小4800*3600
    collageResult.paste(image1, (0, 0))
    collageResult.paste(image2, (0, 3600))

    # 绘制横线（如果需要的话）
    draw = ImageDraw.Draw(collageResult)
    draw.line([(0, 3600), (4800, 3600)], fill='black', width=1)

    # 保存拼接图片
    collage_filename = os.path.join(output_folder, f'collage_{os.path.splitext(os.path.basename(image1_path))[0]}.jpg')
    collageResult.save(collage_filename, quality=100)
    # collageResult.show(f'{str(i // 2 + 1)}_collageResult')  # 如果需要显示图片，可以取消注释这行

def process_folder(folder_path, output_path,size):
    if not os.path.exists(folder_path):
        messagebox.showerror("错误", "文件夹不存在！")
        return

    image_extensions = {
        '.jpg', '.jpeg',  # JPEG格式的图片
        '.png',  # PNG格式的图片
        '.bmp',  # BMP格式的图片
        '.gif',  # GIF格式的图片（通常用于动画）
        '.tiff', '.tif',  # TIFF格式的图片（常用于高质量图像）
        '.webp',  # WebP格式的图片（由Google开发，用于网页）
        '.heic', '.heif',  # HEIF格式的图片（高效图像文件格式，常用于iOS设备）
        '.psd',  # Photoshop的源文件格式
        '.svg',  # 可缩放矢量图形格式
        '.ico',  # 图标文件格式
        '.jfif',  # JPEG File Interchange Format
        '.raw',  # 原始图像格式（常用于相机）
        '.dng',  # Adobe Digital Negative (常用于专业相机)
        '.cr2', '.crw',  # Canon Raw格式
        '.nef',  # Nikon Raw格式
        '.orf',  # Olympus Raw格式
        '.arw',  # Sony Raw格式
        '.rw2',  # Panasonic Raw格式
        '.pef',  # Pentax Raw格式
        '.srf',  # Samsung Raw格式
        '.x3f',  # Fujifilm Raw格式
        '.raf',  # Fujifilm Raw格式（另一种）
        '.indd',  # Adobe InDesign文件格式（虽然不是纯图片格式，但常包含图片）
        '.eps',  # Encapsulated PostScript格式（常用于打印）
        '.ai',  # Adobe Illustrator文件格式（矢量图形）
        '.drw',  # CorelDRAW文件格式（矢量图形）
        '.indd',  # Adobe InDesign文件格式（排版软件，可能包含图片）
        # 注意：像.indd和.ai这样的文件虽然可以包含图片，但它们本身不是图片格式，而是图形设计软件的文件格式。
        # 在筛选图片时，通常不会包括这些格式，除非你明确知道需要处理这些文件中的嵌入图片。
    }
    images = os.listdir(folder_path)
    images = [f for f in os.listdir(folder_path) if os.path.splitext(f)[1].lower() in image_extensions]
    tmp_borderEntry = border_percent_entry.get()
    border_percent = 5 if not tmp_borderEntry else int(tmp_borderEntry)

    if size == '3inch':
        # 遍历图片，每两张调用一次concatTwoPic函数
        for i in range(0, len(images), 2):
            if i + 1 < len(images):  # 确保还有第二张图片可以拼接
                image1_path = os.path.join(folder_path, images[i])
                image2_path = os.path.join(folder_path, images[i + 1])
                concatTwoPic(image1_path, image2_path, output_path, border_percent)
            else:
                print(f"警告：剩余一张图片 {images[i]} 无法进行拼接，请确保图片数量为偶数。")
    elif size == '6inch':
        for idx, image_file in enumerate(images):
            image_path = os.path.join(folder_path, image_file)
            resized_image = resize_6inch_image(image_path, border_percent)
            resized_image.save(f'{output_path}/6inch_resized_{idx + 1}_{size}.jpg')
    messagebox.showinfo("成功", f"{size}照片处理完成！")

def select_input_folder():
    input_folder_path = filedialog.askdirectory(title="选择输入文件夹")
    if input_folder_path:
        input_folder_entry.delete(0, tk.END)
        input_folder_entry.insert(0, input_folder_path)


def select_output_folder():
    output_folder_path = filedialog.askdirectory(title="选择输出文件夹")
    if output_folder_path:
        output_folder_entry.delete(0, tk.END)
        output_folder_entry.insert(0, output_folder_path)


def process_6inch():
    input_path = input_folder_entry.get()
    output_path = output_folder_entry.get()
    process_folder(input_path, output_path,'6inch')
    # 确保输出文件夹存在
    os.makedirs('output_6inch', exist_ok=True)


def process_3inch():
    input_path = input_folder_entry.get()
    output_path = output_folder_entry.get()
    process_folder(input_path, output_path,'3inch')
    # 确保输出文件夹存在
    os.makedirs('output_3inch', exist_ok=True)


# 创建tkinter窗口
root = tk.Tk()
root.title("照片处理工具")

# 输入文件夹输入框和按钮
tk.Label(root, text="输入文件夹:").grid(row=0, column=0)
input_folder_entry = tk.Entry(root)
input_folder_entry.grid(row=0, column=1)
tk.Button(root, text="浏览", command=select_input_folder).grid(row=0, column=2)

# 输出文件夹输入框和按钮
tk.Label(root, text="输出文件夹:").grid(row=1, column=0)
output_folder_entry = tk.Entry(root)
output_folder_entry.grid(row=1, column=1)
tk.Button(root, text="浏览", command=select_output_folder).grid(row=1, column=2)

# 输出白边百分比
tk.Label(root, text="请输入白边百分比:").grid(row=2, column=0)
border_percent_entry = tk.Entry(root)
border_percent_entry.insert(0, "5")
border_percent_entry.grid(row=2, column=1)

# 处理按钮
tk.Button(root, text="生成6英寸照片", command=process_6inch).grid(row=3, column=0, columnspan=2)
tk.Button(root, text="生成3英寸照片", command=process_3inch).grid(row=4, column=0, columnspan=2)

# 运行tkinter事件循环
root.mainloop()